package wh.threadlocal;

/**
 * @author: wh(1835734390 @ qq.com)
 * @date: 2022/4/27 9:48
 * @description:第五种情况：有1000个任务，我们利用线程池去处理；同时，让这1000个任务，共享同一个SimpleDateFormat对象；
 * 同时，给调用SimpleDateFormat方法的语句块加锁，使用synchronized关键字
 * @version:
 */
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ThreadLocalNormalUsage04 {

    public String date(int seconds) {
        //seconds单位是秒，而Date()的参数要求是毫秒；所这儿乘1000了；
        //【这个返回的日期】=【1970.1.1 00:00:00】+【1000*seconds】；（PS：如果在东八区的话，就是【1970.1.1 08:00:00】）
        Date date = new Date(1000 * seconds);
        String s = null;
        //加锁 同一时间只能有一个线程执行这个代码块，也就意味着同一时间只能有一个线程使用SimpleDateFormat对象，避免了线程安全问题
        //但是，如果我们使用synchronized关键字后，就会导致在同一时间，只能有一个线程使用SimpleDateFormat对象；
        // 而这，就完全发挥不出“10个线程，能同时处理任务，从而提高处理1000个任务的速度”的优点了
        synchronized (ThreadLocalNormalUsage04.class) {
            s = dateFormat.format(date);
        }
        return s;
    }

    //定义时间显示格式
    static SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
    //创建一个线程池
    public static ExecutorService threadPool = Executors.newFixedThreadPool(10);

    //这儿我们使用synchronized解决了线程安全问题；但，synchronized也会导致性能的降低；
    public static void main(String[] args) throws InterruptedException {
        for (int i = 0; i <1000 ; i++) {
            int finalI = i;
            //然后，把任务放到线程池中；
            threadPool.submit(new Thread(new Runnable() {
                @Override
                public void run() {
                    String date = new ThreadLocalNormalUsage04().date(finalI);
                    System.out.println(date);
                }
            }));
        }
        threadPool.shutdown();//最后，记得把线程池给关闭
    }
}
